/** @file
 * Platforma.h
 *
 *  Created on: 2012-03-04
 *  @author: Kamil Mówiński <xnasterx@gmail.com>
 */

#ifndef PLATFORMA_H_
#define PLATFORMA_H_
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc_c.h>

#include "Options.h"
#include "Engine.h"
#include "Log.h"
#include "Usart.h"

#include <iostream>
#include <string>
#include <cstdlib>

//////////////////
/** Stała kompilacji przechowująca szerokość okna */
#define WIDTH 800
/** Stała kompilacji przechowująca wysokość okna */
#define HEIGHT 600

/** Główna klasa programu, zarządzająca pozostałymi.
 * Do jej zadań należą odczytywanie klatek z kamery, wyświetlanie
 * obrazu oraz tekstu związanego z działaniem robota
 */
class Platforma {
private:
	/** Pole przechowujące stan ekranu */
	SDL_Surface * screen;
	/** Pole przechowujące obiekt kamery */
	CvCapture * camera;
	/** Pole przechowujące obiekt czcionek */
	TTF_Font *font;
	/** Zmienna typu boolean oznajmująca czy wykonywanie programu
	 * przebiega bez błędów
	 */
	bool error;

	/** Pole przechowujące obiekt odpowiadający za koordynacje
	 * silników robota z działaniem programu
	 */
	Engine * engine;
	/** Pole z obiektem odpowiadający za przechwytywanie opcji
	 * wprowadzanych przez użytkownika
	 */
	Options * opt;
	/** Pole z klasą logującą. Pozwala na przechowywanie logów
	 * programu oraz zapisywanie ważnych informacji czasu wykonania
	 */
	Log * log;
	/** Pole z klasą odpowiadającą za komunikację Aplikacja <=> Robot */
	Usart * usart;

	/** Wirtualna metoda pobierająca nową klatkę obrazu z kamery
	 * i wyświetlająca go
	 */
	virtual void GetNewFrame(void);
	/** Metoda odpowiadająca za konwersje obrazu z zapisu OpenCV na
	 * czytelny dla SDL.
	 */
	SDL_Surface * IplToSurface(IplImage *opencvimg);

public:
	/** Konstruktor inicjalizujący wszystkie pola klasy */
	Platforma();
	/** Destruktor zwalniający wszystkie pola klasy */
	virtual ~Platforma();
	/** Metoda pozwalający w łatwy sposób na pisanie w oknie.
	 * @param text ciąg znaków do wyświetlenia
	 * @param x pozycja w pikselach liczona od lewego górnego wierzchołka
	 * @param y pozycja w pikselach liczona od lewego górnego wierzchołka
	 */
	void PutText(const char * text, int x, int y);
	/** Główna pętla programu */
	void Loop(void);
	/** Metoda zwracająca czy wszystkie poprzednie operacje przebiegły
	 * bez problemu
	 */
	bool Error(void) {return error;}
};

#endif /* Platforma_H_ */
